/*--------------------widget.h --------------------*/
void readHoldingRegisters(quint8 slaveAddress, quint16 startAddress, quint16 count, int id)
/*--------------------widget.cpp --------------------*/
//读取保持寄存器(03 功能码)
void Widget::readHoldingRegisters(quint8 slaveAddress, quint16 startAddress, quint16 count, int id)
{
//检查连接
if (RTU_Device->state() != QModbusDevice::ConnectedState){
qDebug() << "Modbus 设备未连接";
return;
}
//创建读取请求
QModbusDataUnit readUnit(QModbusDataUnit::HoldingRegisters, startAddress, count);
//发送请求
if (auto *reply = RTU_Device->sendReadRequest(readUnit, slaveAddress)){
if (!reply->isFinished()){
connect(reply, &QModbusReply::finished, this, [reply, this, id](){
if (reply->error() == QModbusDevice::NoError){
const QModbusDataUnit unit = reply->result();
for (int i = 0; i < unit.valueCount(); i++){
qDebug() << "寄存器" << unit.startAddress() + i << "的值:" << unit.value(i);
switch (id) {
case 1:
{
qDebug() <<"第一个寄存器 = " << unit.value(0);
break;
}
default:
break;
}
}
} else {
qDebug() << "读取错误:" << reply->errorString();
}
reply->deleteLater();//释放资源
});
} else {
reply->deleteLater();//处理已完成的响应
}
} else {
qDebug() << "读取请求失败";
}
}
/*--------------------widget.h --------------------*/
void writeSingleRegister(quint8 slaveAddress, quint16 startAddress, int data)
/*--------------------widget.cpp --------------------*/
//写入保持寄存器(06 功能码)
void Widget::writeSingleRegister(quint8 slaveAddress, quint16 startAddress, int data)
{
//检查连接
if (data < 0 || data > 65535) {
qDebug() << "错误:写入值超出范围(0~65535),实际值:" << data;
return;
}
//检查写入值 data 是否超出 保持寄存器 范围(0 ~ 65535)
if (RTU_Device->state() != QModbusDevice::ConnectedState) {
qDebug() << "Modbus 设备未连接";
return;
}
//安全转换为 quint16
quint16 valueToWrite = static_cast<quint16>(data);
//创建写入请求(写入 1 个寄存器)
QModbusDataUnit writeUnit(QModbusDataUnit::HoldingRegisters, startAddress, 1);
//设置第0个寄存器(即 startAddress 对应的那个)的值为 valueToWrite
writeUnit.setValue(0, valueToWrite);
//发送写请求到指定从站地址
QModbusReply *reply = RTU_Device->sendWriteRequest(writeUnit, slaveAddress);
if (!reply) {
qDebug() << "写入失败:无法创建写请求";
return;
}
if (!reply->isFinished()) {
//异步:等待 Modbus 设备回复
QObject::connect(reply, &QModbusReply::finished, this, [this, reply]() {
if (reply->error() == QModbusDevice::NoError) {
qDebug() << "写入成功!";
} else {
qDebug() << "写入失败,错误:" << reply->errorString();
}
reply->deleteLater();//须释放内存
});
} else {
//如果回复已经完成(极少数同步情况)
if (reply->error() == QModbusDevice::NoError) {
qDebug() << "写入成功!";
} else {
qDebug() << "写入失败,错误:" << reply->errorString();
}
reply->deleteLater();//须释放内存
}
}